package cn.edu.scau.cmi.front.service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import cn.edu.scau.cmi.ema.domain.Foodtype;
import cn.edu.scau.cmi.ema.service.base.CmiEmaService;
import cn.edu.scau.cmi.ema.util.SegmenterUtil;

@Repository("CmiFoodtypeService")
@Transactional
public class CmiFoodtypeServiceImpl extends CmiEmaService implements CmiFoodtypeService {
	
	@Value("#{food2type}")  
	Properties food2type;

	@Override
	public Set<Integer> getDescendantIds(int rootFoodtypeId) {

		Set<Integer> foodtypeIds = new HashSet<Integer>();
		ArrayList<Integer> foodtypeIdList = new ArrayList<>();
		foodtypeIdList.add(rootFoodtypeId);
		for (int i = 0; i < foodtypeIdList.size(); i++) {
			Set<Integer> foodtypeIdsByParent = foodtypeDAO.findFoodtypeIdsByParent(foodtypeIdList.get(i));
			// 下面这一行要注释掉，不然遍历不完全！！！会漏掉第一个新集合的第一个数据
			// if(i == 0) foodtypeIdList.clear();
			if (!foodtypeIdsByParent.isEmpty()) {
				foodtypeIdList.addAll(foodtypeIdsByParent);
			}
		}

		foodtypeIds.addAll(foodtypeIdList);

		return foodtypeIds;
	}
	
//	根据字符串匹配食品类型：食品属于与哪一种食品类型，并将匹配的食品类型写入到电子表格中。
	@Override
	public Set<Foodtype> fuzzyMatchFoodtype(String fuzzyFoodName) {
//		精确查找
		Set<Foodtype> foodtypes = foodtypeDAO.findFoodtypeByName(fuzzyFoodName);
//		（1）注意字符集的问题；properties文件中食物名称-》食物类别名称
//		从数据库中查找，如果查找的到，
//		（1）首先用名字的全名查找，如果找到就直接返回，这个需要检查以下，应该是返回的唯一的一条记录！！！！！！
		if(foodtypes.size()==0) {
//			包含查找
			foodtypes = foodtypeDAO.findFoodtypeByNameContaining(fuzzyFoodName);
//			分词查找
			if(foodtypes.size()==0) {
				Set<String> indexSegments = SegmenterUtil.getSegmentByIndex(fuzzyFoodName);
//				去除明显不合理的分词的数据
				for(String segment: indexSegments) {
					if(!segment.matches("[0-9]+")) {
						foodtypes.addAll(foodtypeDAO.findFoodtypeByNameContaining(segment));
					}
				}
//				如果还没有找到，就一个字一个字的查找。使用另一种分词的方法，忘记叫什么名字了！！！！！！
				if(foodtypes.size() ==0) {
					Set<String> searchSegments = SegmenterUtil.getSegmentByIndex(fuzzyFoodName);
//					去除明显不合理的分词的数据
					for(String segment: searchSegments) {
						if(!segment.matches("[0-9]+")) {
							foodtypes.addAll(foodtypeDAO.findFoodtypeByNameContaining(segment));
						}
					}
					if(foodtypes.size() ==0) {
						for(int i=0; i<fuzzyFoodName.length(); i++) {
							foodtypes.addAll(foodtypeDAO.findFoodtypeByNameContaining(String.valueOf(fuzzyFoodName.charAt(i))));
						}
					}
				}
			}
		}
		return foodtypes;
	}
}